// 操作整个音乐项目中和H5新加入的localstorage相关的逻辑
// 利用一个插件来使用localstorage
import storage from 'good-storage'

const SEARCH_KEY = '_search_'
const SEARCH_MAX_LENGTH = 15

const PLAY_KEY = '_play_'
const PLAY_MAX_LENGTH = 200

const FAVORITE_KEY = '_favorite_'
const FAVORITE_MAX_LENGTH = 200

// 数组中的数据排行，最新存储的放最前面
function insetArray (arr, val, compare, maxLen) {
  // findIndex是es6的api,查找数组中是不是有某个元素
  const index = arr.findIndex(compare)
  // 如果是第一条数据的位置
  if (index === 0) {
    return
  }
  // 如果不是第一条数据
  if (index > 0) {
  // 那么就把数组中这条数据删除
    arr.splice(index, 1)
  }
  // 添加到数组的第一个位置
  arr.unshift(val)
  // 判断是不是最大长度超过而来限制maxLen
  if (maxLen && arr.length > maxLen) {
    // 删除数组最后一个元素
    arr.pop()
  }
}

// 删除歌曲数据方法
function deleteFromArray (arr, compare) {
  const index = arr.findIndex(compare)
  // 如果有的话
  if (index > -1) {
    // 删除
    arr.splice(index, 1)
  }
}

export function saveSearch (query) {
  // 如果现在storage存储情况没有东西，那么就给空数组
  let searches = storage.get(SEARCH_KEY, [])
  insetArray(searches, query, (item) => {
    return item === query
  }, SEARCH_MAX_LENGTH)
  // 保存下来
  storage.set(SEARCH_KEY, searches)
  // 把保存后的新数组输出
  return searches
}

// 去本地缓存去读取内存
export function loadSearch () {
  return storage.get(SEARCH_KEY, [])
}

// 删除对应的歌曲返回
export function deleteSearch (query) {
  // 获取存储列表
  let searches = storage.get(SEARCH_KEY, [])
  deleteFromArray(searches, (item) => {
    return item === query
  })
  // 保存下来
  storage.set(SEARCH_KEY, searches)
  // 把保存后的新数组输出
  return searches
}

// 在列表中删除所有歌曲
export function clearSearch () {
  storage.remove(SEARCH_KEY)
  return []
}

// 存储
export function savePlay (song) {
  let songs = storage.get(PLAY_KEY, [])
  insetArray(songs, song, (item) => {
    return item.id === song.id
  }, PLAY_MAX_LENGTH)
  // 缓存到本地
  storage.set(PLAY_KEY, songs)
  // 返回新的数组
  return songs
}

// 获取存储
export function loadPlay () {
  return storage.get(PLAY_KEY, [])
}

export function saveFavorite (song) {
  let songs = storage.get(FAVORITE_KEY, [])
  insetArray(songs, song, (item) => {
    return song.id === item.id
  }, FAVORITE_MAX_LENGTH)
  storage.set(FAVORITE_KEY, songs)
  return songs
}

export function deleteFavorite (song) {
  let songs = storage.get(FAVORITE_KEY, [])
  deleteFromArray(songs, (item) => {
    return song.id === item.id
  })
  storage.set(FAVORITE_KEY, songs)
  return songs
}

export function loadFavorite () {
  return storage.get(FAVORITE_KEY, [])
}
